import axios from 'axios'
// 从element-ui里面引入的Message方法
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
import { getTime } from '@/utils/auth'

// create an axios instance
const request = axios.create({
  // 使用环境变量进行动态配置
  baseURL: process.env.VUE_APP_BASE_API
})

// 后端告诉你token的超时时间
const timeOut = 10000 // 超时的时间，单位是秒，本地存储存的时间是毫秒

// 判断token是否超时
function isTimeOut() {
//   当前时间-存储的时间 > 5000 过期
  const currentTime = Date.now() // 当前时间
  const localTime = getTime() // 本地存储的时间
  return currentTime - localTime > timeOut * 1000
}

// 请求拦截器
request.interceptors.request.use((config) => {
  // 处理token注入
  // 获取到token
  // 本地存储
  const token = store.state.user.token

  // 判断token是否存在
  if (token) {
    // 判断token是否过期
    // 如果过期了，需要退出登录
    // 如果没有过期，再注入token
    // Bearer后面有一个空格，必须要添加
    // if (isTimeOut()) {
    // // 清空用户信息和token
    //   store.dispatch('user/logoutAction')
    //   //   跳转登录页面
    //   router.push('/login')
    //   //   return一个reject的promise
    //   return Promise.reject(new Error('token过期'))
    // }
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
})

// 响应拦截器，处理接口返回数据的逻辑
request.interceptors.response.use((response) => {
// 先要拿到接口返回的数据进行判断
  const { success, message, data } = response.data // axios包了一层data
  //   进行判断
  // 如果success为true，表示数据可用，返回data
  // success不为true，数据不可用，提示message的错误消息

  // 1、处理data数据
  // 2、全局错误提示
  // 3、token过期处理

  // 跟后端约定好的成功的规则
  if (success) {
    return data
  } else {
  //   错误提示
    Message.error(message) // message: 后端返回的错误消息
    return Promise.reject(message)
  }
}, err => {
  // 判断401

  // 判断状态码是不是401
  // 如果是401，退出登录
  // 如果请求的状态吗不是200-300之间，就会走错误处理函数
  // 如果请求出错
  // console.dir(err.response.status === 401)
  if (err.response.status === 401) {
    // 退出登录
    store.dispatch('user/logoutAction')
    // 跳转登录界面
    router.push('/login')
    // 错误提示
    Message.error('token过期')
  } else {
    Message.error(err.message)
  }
  return Promise.reject(err)
})

// axios响应拦截器

export default request
